您现在的位置:首页 > 学术研究 > 读书笔记 > 限制小数输入的EDIT控件编程方法和显示字符串的PICTURE控件 - VC(转)
限制小数输入的EDIT控件编程方法和显示字符串的PICTURE控件 - VC(转)
[发布时间:2011-10-05  阅读次数: 5576]
介绍

在VCHELP论坛中经常看到一些人提出来许多的问题,其中有很多的问题具有很多的针对性和普片性,这里就两个问题进行简要的回答,也许很多高手有更简单的解答方法,不过这里的方法希望能给各位或者初学者有帮助.

正文

问题一.如何是EDIT支持小数的输入.

一般的EDIT控件支持很多格式的输入,如果要支持数据的输入的话,你可以修改EDIT控件属性,选中NUMBER属性就可以了,但是这样不支持.号的输入,也就是不支持小数的输入了.

这里的解决方法是派生一个类CEDIT,然后映射消息EN_CHANGE,因为如果你的控件使用这个派生类的话,在你进行你的EDIT控件进行输入字符改变的时候都会触发这个事件,不用为你的控件每个触发EN_CHANGE事件了.然后判断新输入的字符,如果这个字符符合数字规则或者.号规则,再计算已经出现的.号次数,当符合这种条件时允许输入操作,否则删除刚输入的字符,进行重新设置编辑框字符串的操作.

可能涉及到的问题,1:如何判断一个字符串是数字还是别的类型.2:如何查找一个字符串中某个符号出现的次数.3:如何设置EDIT光标的位置.

1 问题的解决方法可以利用下面的方法解决.

CString strtemp=szTemp.SpanIncluding(0123456789);

if(!strtemp.IsEmpty())

//这个字符串为数字

else

//非数字

2 问题我用循环递归的方法实现,首先查找最先出现的符号位置,然后利用字符串分割技术取RIGHT部分再进 行循环调用就可以了,相关代码可以见下:

int CNumEditCtrl::GetStringNum(CString szVal)//获得字符串中间.号的个数

{

int nNum=0;

while(1)

{

int nCount=szVal.Find(.);

if(nCount==-1)

break;

szVal=szVal.Right(szVal.GetLength()-nCount-1);

nNum ;

}

return nNum;

}

3 问题可以采用获得EDIT控件句柄发送EM_SETSEL消息的方法实现.

所以基本代码可以实现见下了:

void CNumEditCtrl::OnChange()

{

// TODO: If this is a RICHEDIT control, the control will not

// send this notification unless you override the CEdit::OnInitDialog()

// function and call CRichEditCtrl().SetEventMask()

// with the ENM_CHANGE flag ORed into the mask.

CString m_estr,szTemp;

GetWindowText(m_estr);

int nLen=m_estr.GetLength();

if(!m_estr.IsEmpty())

{

szTemp=m_estr.Right(1);

BOOL bNum=TRUE;

CString strtemp=szTemp.SpanIncluding(0123456789);

if(!strtemp.IsEmpty())

bNum=TRUE;

else

bNum=FALSE;

nPoint=GetStringNum(m_estr);

if(strcmp(szTemp,.)==0

首页上一页下一页尾页当前为1/1页